import { sys } from "cc"; // 引入 Cocos Creator 引擎中的系统模块
import { Enum_Player } from "../Enum";

// 单例模式的 StorageManager 类，用于管理游戏数据的存储和读取
export default class StorageManager {
    // 单例的静态属性
    private static _instance: StorageManager;

    // 获取 StorageManager 实例的静态方法
    public static get instance(): StorageManager {
        // 如果实例不存在，则创建一个新的实例
        if (!this._instance) {
            this._instance = new StorageManager();
        }
        // 返回实例
        return this._instance;
    }

    // 构造函数私有化，防止外部实例化
    private constructor() { }

    // 定义一个初始的用户数据对象，用于存储玩家的游戏数据
    public userData = {
        goldCoins: 0, // 金币数量
        currRole: Enum_Player.Role2, // 当前角色ID
        haveRole: [1], // 拥有的角色ID数组
        currArms: 1, // 当前武器ID
        haveArms: [1], // 拥有的武器ID数组
        playMaxTime: 0, // 游玩最高时间
        music: false, // 音乐开关
        sound: true, // 音效开关
    }

    // 保存数据到本地存储
    public saveData(key: string, data: Object) {
        // 检查是否支持本地存储
        if (sys.localStorage) {
            // 将 userData 对象转换为 JSON 字符串并保存到本地存储中，key 为 "userData"
            sys.localStorage.setItem(key, JSON.stringify(data));
        } else {
            // 如果不支持本地存储，输出提示信息
            console.log("不支持本地存储");
        }
    }

    // 从本地存储中加载数据
    public loadData(key: string) {
        // 检查是否支持本地存储
        if (sys.localStorage) {
            // 从本地存储中获取 key 为 "userData" 的数据
            const data = sys.localStorage.getItem(key);
            // 如果有数据，则将 JSON 字符串转换为对象并返回
            if (data) {
                return JSON.parse(data);
            } else {
                return null;
            }
        } else {
            // 如果不支持本地存储，输出提示信息
            console.log("不支持本地存储");
        }
    }

    // 获取与修改当前角色
    private _currRole: Enum_Player;
    public get currRole(): Enum_Player {
        // ??= 是一个逻辑空值合并运算符，用于在左侧操作数为 null 或 undefined 时返回右侧操作数
        return this.loadData("userData")?.currRole ?? this.userData.currRole;
    }
    public set currRole(value: Enum_Player) {
        this._currRole = value;
        // 将 userData 对象中的 currRole 属性设置为 value,然后保存回去
        const userData = this.loadData("userData");
        userData && (userData.currRole = value);
        this.saveData("userData", userData);
    }

    // 获取与修改游玩最高时间
    private _playMaxTime: number;
    public get playMaxTime(): number {
        return this.loadData("userData")?.playMaxTime ?? this.userData.playMaxTime;
    }
    public set playMaxTime(value: number) {
        this._playMaxTime = value;
        // 将 userData 对象中的 playMaxTime 属性设置为 value,然后保存回去
        const userData = this.loadData("userData");
        userData && (userData.playMaxTime = value);
        this.saveData("userData", userData);
    }

    // 获取与修改音乐
    private _music: boolean;
    public get music(): boolean {
        return this.loadData("userData")?.music ?? this.userData.music;
    }
    public set music(value: boolean) {
        this._music = value;
        // 将 userData 对象中的 music 属性设置为 value,然后保存回去
        const userData = this.loadData("userData");
        userData && (userData.music = value);
        this.saveData("userData", userData);
    }

    // 获取与修改音效
    private _sound: boolean;
    public get sound(): boolean {
        return this.loadData("userData")?.sound ?? this.userData.sound;
    }
    public set sound(value: boolean) {
        this._sound = value;
        // 将 userData 对象中的 sound 属性设置为 value,然后保存回去
        const userData = this.loadData("userData");
        userData && (userData.sound = value);
        this.saveData("userData", userData);
    }
}
